import "@formatjs/intl-durationformat/polyfill";
import deepEqual from "fast-deep-equal";
import memoize from "micro-memoize";

import { getI18next } from "./index";

const deepMemoize: typeof memoize = (fn) => memoize(fn, { isEqual: deepEqual });

const createDateTimeFormatter = deepMemoize(
  (language: string, options: Intl.DateTimeFormatOptions) => {
    return new Intl.DateTimeFormat(language, options);
  }
);

const createDurationFormatter = deepMemoize(
  (language: string, options: Intl.DurationFormatOptions) => {
    return new Intl.DurationFormat(language, options);
  }
);

export const formatDate = deepMemoize(
  (
    value: number | Date | string,
    format: Intl.DateTimeFormatOptions = {}
  ): string => {
    if (typeof value === "string") {
      return formatDate(new Date(value), format);
    }

    const i18n = getI18next();
    const dateFormatter = createDateTimeFormatter(i18n.language, format);
    return dateFormatter.format(value);
  }
);

export const formatDuration = deepMemoize(
  (
    duration: Intl.DurationInput,
    options: Intl.DurationFormatOptions = {}
  ): string => {
    const i18n = getI18next();

    const dateFormatter = createDurationFormatter(i18n.language, options);
    return dateFormatter.format(duration);
  }
);
